iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
自我挑戰組

Lex & Yacc 學習筆記系列 第 22

[Day22] Yacc - Error Handling

  • 分享至 

  • xImage
  •  

本篇內容

  • 複習 yyerror
  • 介紹 YYABORT
  • 範例 - 簡易計算機7

介紹

我們在 [Day7] Lex - Error Handling 的時候,有提到在 lex 中如何處理不在預期的輸入字串。

在yacc的規則匹配期間,我們一樣可以用 yyerror 這個 function 來處理不符合規則的情況。

由於 lex & yacc 是共用同一個 yyerror ,因此小心不要重複定義啦!

那麼,如果出現嚴重的錯誤,有辦法讓Yacc提前終止嗎?

這裡我們可以用 YYABORT 來辦到這件事。
它會直接結束 yyparse() 並回傳一個非零值,表示失敗。

範例 - 簡易計算機7

說明

請根據昨天的範例(簡易計算機6),將除法規則中,遇到除數為0的情況下,輸出錯誤訊息,並提前終止計算機。

程式實作

  • 在Yacc當中的 expr 規則裡,我們加上除數為0的條件判斷式,並呼叫 yyerror 及 YYABORT。
expr:
      value                 { $$ = $1; }
    | expr '+' expr         { $$ = $1 + $3; }
    | expr '-' expr         { $$ = $1 - $3; }
    | expr '*' expr         { $$ = $1 * $3; }
    | expr '/' expr         
        { 
            if ($3 == 0.0) { 
                yyerror("Error: divisor cannot be zero!"); 
                YYABORT; 
            } else { 
                $$ = $1 / $3; 
            } 
        }
    | '-' expr %prec UMINUS { $$ = -$2; }
    | '(' expr ')'          { $$ = $2; }
    ;

執行結果

輸入內容

-27.84 / 0 =

輸出結果

Error: divisor cannot be zero!

結語

經過今天的介紹,我們已經有辦法在 lex & yacc 中都能做到錯誤訊息的處理,避免程式跑到一半就crash了。

參考資料


上一篇
[Day21] Yacc - 多型別字串的運用 (Union)
下一篇
[Day23] Lex 進階 - State 其他用法
系列文
Lex & Yacc 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言